https://git-scm.com/book/zh/v2
git 安装
由于直接使用apt-get下载安装的hgit版本太低,所以我们使用PPA源的方法
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
安装完成后,检查是否安装成功
git --version
显示 git version x.x.x,表明安装成功。
git配置
(1)设置用户名和email。
git config --global user.name “Your Name”
git config --global user.email "youremail@domain.com
(2)为GitHub账号添加SSH Keys
$ ssh-keygen -t rsa -C "youremail@163.com"
系统会提示key的保存位置(一般是~/.ssh目录)和指定口令,保持默认,连续三次回车即可。
(3)Copy SSH Key
然后用vim打开该文件,id_rsa.pub文件内的内容,粘帖到github帐号管理的添加SSH key界面中。
$vim ~/.ssh/id_rsa.pub
(4)添加到GitHub
登录github-> Accounting settings图标-> SSH key-> Add SSH key-> 填写SSH key的名称(可以起一个自己容易区分的),然后将拷贝的~/.ssh/id_rsa.pub文件内容粘帖-> add key”按钮添加。
(5)测试
$ssh -T git@github.com
git基本操作和理解
如果有耐心的话可以通过
git help -a 查看所有的命令
git help -i 查看命令的信息
git help 命令 查看这条命令的文档
例如 git help push
会显示出push的文档,按q键退出文档
一.初始化操作
1.git init
这条命令对于我来说用的不多,这条命令可能对于我来说可有可无.
我的理解是,当你在github网页上新建一个空Repository,想把本地的文件上传到服务器时,init操作是在本地的一个文件夹中建立一个.git文件来记录这个文件夹对应的是github上面的那个Repository
2.git remote add <你想要给你项目取的别名> < github上面项目的url>
在init命令后输入这条语句.这样就实现了本地仓库和远程仓库的链接
以下命令查看当前本地仓库对应的(就是链接本地和远程的.git)远程仓库的情况
$ git remote //不带参数 仅仅列出已经存在的远程分支的名字
$ git remote -v //-v 列出详细信息,在每一个名字后面列出其远程url
3.git clone < github项目的url>
除了通过init+remote add来创建本地仓库并链接github服务器的项目以外,我们可以通过clone到本地来达到同样的效果
此时会在本地自动创建一个和服务器项目名字一样的文件夹,把服务器上面所有的文件下载下来,并自动创建.git文件,同时对于上面remote add操作,git会默认取别名为origin
二.同步(下载到本地和上传到github服务器)
1.git pull <别名> <当前所处分支>
这一步是init+remote add后把服务器上的文件下载下来的步骤,<当前所处分支>一般情况是master
可以通过git branch查看分支情况,前面带*的就是当前分支
如果是通过clone进行则不需要这一步,因为clone里面已经包含了下载服务器上面的文件的任务
2.
$ git add -A //-A表示的是提交所有文件的修改
$ git commit -m “这是是这次提交时附加的消息” //参数-m 代表加上附加信息
$ git push <别名> <当前所处分支>
在把服务器上面的内容拷贝到本地后,你开始了自己的修改,文件发生了改变.
上面三个步骤是把本地的文件改动提交到github服务器上
注意:只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
这就是文件冲突(我的理解).
三.提交到上游主干
如果你的这个项目是从别人的仓库中fork来的分支,如果你想把自己的改动提交到别人的仓库中,可以在网页自己账户的仓库中,点击new pull request,然后create pull request
四.查看状态
下图是文件状态的生命周期:
git status
要查看哪些文件处于什么状态
1.
On branch master
nothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。
2.在项目下创建一个新的 README 文件
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;
3.使用命令 git add 开始跟踪一个文件。要跟踪 README 文件,运行:
$ git add README
此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要在 Changes to be committed 这行下面的,就说明是已暂存状态。
4.暂存已修改文件
现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运行 git status 命令,会看到下面内容:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
文件 CONTRIBUTING.md 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add 命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。 现在让我们运行 git add 将"CONTRIBUTING.md"放到暂存区,然后再看看 git status 的输出:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
五.提交更新
1.$ git commit
这种方式会启动文本编辑器以便输入本次提交的说明。 (默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。当然也可以使用 git config --global core.editor <你的软件> 命令设定你喜欢的编辑软件。)
编辑器会显示类似下面的文本信息(本例选用 Vim 的屏显方式展示):
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
可以看到,默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。 你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。 (如果想要更详细的对修改了哪些内容的提示,可以用 -v 选项,这会将你所做的改变的 diff 输出放到编辑器中从而使你知道本次提交具体做了哪些修改。) 退出编辑器时,Git 会丢掉注释行,用你输入提交附带信息生成一次提交。
2.$ git commit -m “附加信息”
另外,你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
六.跳过使用暂存区域
git commit -a
只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,例如:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)
七.移除文件
1. git rm <文件名>
从暂存区域移除,并连带从工作目录中删除指定的文件
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母)。
这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。
2. git rm --cached <文件名>
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。
当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。
为达到这一目的,使用 --cached 选项.
利用这种方式,可以删除一类我们不需要的文件
$ git rm log/\*.log
此命令删除 log/ 目录下扩展名为 .log 的所有文件。
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不得不不用 shell 来帮忙展开。
类似的比如:
$ git rm \*~
该命令为删除以 ~ 结尾的所有文件。
八. 查看提交历史
git log
以下是常用的log后的参数:
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
九.撤消操作
1.$ git commit --amend
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:
$ git commit --amend
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。
2.取消暂存的文件
演示如何操作暂存区域与工作目录中已修改的文件。 这些命令在修改文件状态的同时,也会提示如何撤消操作。
例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了 git add * 暂存了它们两个。 如何只取消暂存两个中的一个呢?
git status 命令提示了你:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
这个命令有点儿奇怪,但是起作用了。 CONTRIBUTING.md 文件已经是修改未暂存的状态了。
Note
虽然在调用时加上 --hard 选项可以令 git reset 成为一个危险的命令(译注:可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。 不加选项地调用 git reset 并不危险 — 它只会修改暂存区域。
3.撤消对文件的修改
如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改 - 将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 幸运的是,git status 也告诉了你应该如何做。 在最后一个例子中,未暂存区域是这样:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
它非常清楚地告诉了你如何撤消之前所做的修改。 让我们来按照提示执行:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
可以看到那些修改已经被撤消了。
Important
你需要知道 git checkout – [file] 是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
如果你仍然想保留对那个文件做出的修改,但是现在仍然需要撤消,我们将会在 Git 分支 介绍保存进度与分支;这些通常是更好的做法。
记住,在 Git 中任何 已提交的 东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复。 然而,任何你未提交的东西丢失后很可能再也找不到了。
十.remote-远程仓库使用
$ git remote //不带参数 仅仅列出已经存在的远程分支的名字
$ git remote -v //-v 列出详细信息,在每一个名字后面列出其远程url
$ git remote add <你想要给你项目取的别名> <github上面项目的url> //添加远程仓库,现在你可以在命令行中使用那个<别名> 来代替整个 URL
$ git fetch <别名> //这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看.
注意:必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
$ git pull <别名> <当前所处分支> //来自动的抓取然后合并远程分支到当前分支
$ git remote show <别名> //查看某一个远程仓库的更多信息
$ git remote rename <原来的名字> <后来修改的名字> //重命名远程仓库
$ git remote rm <别名> //移除远程仓库